/**
 * 运算是涉及零个或多个输入值（称为操作数）并产生新值（称为输出值）的数学过程。要执行的特定操作由称为运算符的构造（通常是一个符号或一对符号）表示。
 * 
 * 复合表达式的求值
 *   为了计算表达式，编译器必须做两件事：
 *   在编译时，编译器必须解析表达式并确定操作数如何与运算符分组。这是通过优先级和关联性规则来完成的，我们将立即讨论这些规则。
 *   在编译时或运行时，将对操作数求值并执行操作以产生结果。
 * 
 * 运算符优先级
 *   为了帮助解析复合表达式，所有运算符都被分配了一定的优先级。优先级较高的运算符首先与操作数分组。
 * 
 * C++ 不包含用于求幂的运算符（operator^在 C++ 中具有不同的功能）
 * 
 * 最佳实践
 *   使用括号来明确如何计算不平凡的复合表达式（即使它们在技术上是不必要的）。
 * 
 * 操作数、函数参数和子表达式可以按任何顺序求值。
 * 
 * 确保您编写的表达式（或函数调用）不依赖于操作数（或参数）的计算顺序。
 * 
 * 
 * 运算优先级示例：
 * (1) x = y = z;
 *     x = (y = z);
 * (2) z *= ++y + 5;
 *     z *= ((++y) + 5);
 * (3) a || b && c || d;
 *     (a || (b && c)) || d
 * 
 */

#include <iostream>

int getValue()
{
    std::cout << "Enter an integer: ";

    int x{};
    std::cin >> x;
    return x;
}

int main() {
    // 具有单个赋值运算符的表达式不需要将赋值的正确操作数括在括号中。
    // x = (y + z + w);   // instead of this
    // x = y + z + w;     // it's okay to do this

    // x = ((y || z) && w); // instead of this
    // x = (y || z) && w;   // it's okay to do this

    // x = (y *= z); // expressions with multiple assignments still benefit from parenthesis

    std::cout << getValue() + (getValue() * getValue()) << '\n'; // a + (b * c)

    return 0;
}